home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 17 / CU Amiga Magazine's Super CD-ROM 17 (1997)(EMAP Images)(GB)[!][issue 1997-12].iso / CUCD / Programming / DiceSource / src / alib / csup / timer_support / TimeDelay.asm < prev    next >
Assembly Source File  |  1995-12-24  |  6KB  |  254 lines

  1. *************************************************************************
  2. *                                    *
  3. *    Copyright (C) 1989, Commodore Amiga Inc.  All rights reserved.    *
  4. *                                    *
  5. *************************************************************************
  6.  
  7.  
  8. *************************************************************************
  9. *
  10. * TimeDelay.asm
  11. *
  12. * Source Control
  13. * ------ -------
  14. * $Id: TimeDelay.asm,v 30.0 1994/06/10 18:10:51 dice Exp $
  15. *
  16. * $Locker:  $
  17. *
  18. *************************************************************************
  19.  
  20.     SECTION    timer
  21.  
  22. *------ Included Files -----------------------------------------------
  23.  
  24.     INCLUDE    'exec/types.i'
  25. ;    INCLUDE    'exec/interrupts.i'
  26.  
  27.     INCLUDE    'devices/timer.i'
  28.  
  29. *------ Imported Names -----------------------------------------------
  30.  
  31. *------ Tables -------------------------------------------------------
  32.  
  33. *------ Defines ------------------------------------------------------
  34.  
  35. CALLSYS    MACRO
  36.     JSR    _LVO\1(A6)
  37.     ENDM
  38.  
  39. XSYS    MACRO
  40.     XREF    _LVO\1
  41.     ENDM
  42.  
  43.  
  44. *------ Functions ----------------------------------------------------
  45.  
  46.  
  47. *------ System Library Functions -------------------------------------
  48.  
  49.     XSYS    AllocSignal
  50.     XSYS    FreeSignal
  51.     XSYS    DoIO
  52.     XSYS    FindTask
  53.     XSYS    OpenDevice
  54.     XSYS    CloseDevice
  55.  
  56. *------ Exported Names -----------------------------------------------
  57.  
  58. *------ Functions ----------------------------------------------------
  59.  
  60.     XDEF    TimeDelay
  61.     XDEF    _TimeDelay
  62.  
  63. *------ Data ---------------------------------------------------------
  64.  
  65. *------ Local Definitions --------------------------------------------
  66.  
  67. timerName:    TIMERNAME
  68.  
  69.  
  70.  
  71.  
  72. ******* amiga.lib/TimeDelay ******************************************
  73. *
  74. *   NAME
  75. *    TimeDelay -- Return after a period of time has elapsed.
  76. *
  77. *   SYNOPSIS
  78. *    Error = TimeDelay( Unit, Seconds, MicroSeconds )
  79. *    D0                 D0    D1       D2
  80. *
  81. *    LONG TimeDelay( LONG, ULONG, ULONG );
  82. *
  83. *   FUNCTION
  84. *    Waits for the period of time specified before returning to the
  85. *    the caller.
  86. *
  87. *   INPUTS
  88. *    Unit -- timer.device unit to open for this command.
  89. *    Seconds -- The seconds field of a timerequest is filled with
  90. *        this value. Check the documentation for what a particular
  91. *        timer.device unit expects there.
  92. *    MicroSeconds -- The microseconds field of a timerequest is
  93. *        filled with this value. Check the documentation for what
  94. *        a particular timer.device units expects there.
  95. *
  96. *   RESULTS
  97. *    Error -- will be zero if all went well; otherwise, non-zero.
  98. *
  99. *   NOTES
  100. *    Two likely reasons for failures are invalid unit numbers or
  101. *    no more free signal bits for this task.
  102. *
  103. *    While this function first appears in V37 amiga.lib, it works
  104. *    on Kickstart V33 and higher.
  105. *
  106. *   SEE ALSO
  107. *    timer.device/TR_ADDREQUEST,
  108. *    timer.device/TR_WAITUNTIL,
  109. *    timer.device/WaitUnitl()
  110. *
  111. *   BUGS
  112. *
  113. **********************************************************************
  114. *
  115. *   IMPLEMENTATION NOTES
  116. *
  117. *
  118. *   REGISTER USAGE
  119. *
  120.  
  121. _TimeDelay:
  122.         move.l    d2,-(sp)
  123.         move.l    8(sp),d0        ; timer unit
  124.         move.l    12(sp),d1        ; seconds
  125.         move.l    16(sp),d2        ; useconds
  126.         bsr.s    TimeDelay
  127.         move.l    (sp)+,d2
  128.         rts
  129.  
  130. TimeDelay:
  131.         subq.l    #TV_SIZE,sp        ; make a timeval
  132.         move.l    sp,a0
  133.         movem.l    d1/d2,(a0)        ; set timeval
  134.         move.l    #TR_ADDREQUEST,d1    ; set the device command
  135.         bsr.s    DoTimer            ; gotoit
  136.         addq.l    #TV_SIZE,sp
  137.         rts
  138.  
  139.  
  140. *****i* timer.device/internal/DoTimer ********************************
  141. *
  142. *   NAME
  143. *    DoTimer -- "DoIO" a timer.device command. (V36)
  144. *
  145. *   SYNOPSIS
  146. *    Error = DoTimer( TimeVal, Unit, Command )
  147. *    D0               A0       D0    D1
  148. *
  149. *    LONG DoTimer( struct timeval *, LONG, WORD );
  150. *
  151. *   FUNCTION
  152. *    Create a timerequest and reply port then perform the
  153. *    device command via DoIO.
  154. *
  155. *   INPUTS
  156. *    TimeVal -- pointer to a timeval structure. Contents copied
  157. *        into IORequest before DoIO.
  158. *    Unit -- timer.device unit to open for this command.
  159. *    Command -- command to perform.
  160. *
  161. *   RESULTS
  162. *    TimeVal -- filled from timeval structure of IORequest after
  163. *        command completes.
  164. *    Error -- will be zero if all went well; otherwise, non-zero.
  165. *
  166. *   NOTES
  167. *
  168. *   SEE ALSO
  169. *
  170. *   BUGS
  171. *
  172. **********************************************************************
  173. *
  174. *   IMPLEMENTATION NOTES
  175. *
  176. *
  177. *   REGISTER USAGE
  178. *
  179.  
  180. DoTimer:
  181.         movem.l    d2-d3/a2-a4/a6,-(sp)
  182.         move.l    4,a6            ; find execbase
  183.         move.l    a0,a4            ; timeval
  184.         move.l    d0,d2            ; unit
  185.         move.l    d1,d3            ; command
  186.  
  187.         lea    -MP_SIZE-IOTV_SIZE(sp),sp
  188.         movea.l    sp,a3            ; IORequest
  189.         lea    IOTV_SIZE(a3),a2    ; reply port
  190.  
  191.         move.b    #NT_MSGPORT,LN_TYPE(a2)    ; set up the node type
  192.         clr.b    LN_PRI(a2)
  193.         clr.l    LN_NAME(a2)        ; no name
  194.         clr.b    MP_FLAGS(a2)
  195.  
  196.         moveq.l    #-1,d0
  197.         CALLSYS    AllocSignal        ; get port signal bit
  198.         cmp.b    #-1,d0
  199.         beq    DTError1
  200.         move.b    d0,MP_SIGBIT(a2)
  201.  
  202.         suba.l    a1,a1            ; find this task
  203.         CALLSYS    FindTask
  204.         move.l    d0,MP_SIGTASK(a2)    ; and fill in this task
  205.         lea    MP_MSGLIST(a2),a0
  206.         NEWLIST    a0            ; initialise message port
  207.  
  208.         lea    timerName,A0
  209.         movea.l    a3,a1            ; this IORequest
  210.         move.l    d2,d0            ; this unit
  211.         moveq.l    #0,d1            ; no special flags
  212.         CALLSYS    OpenDevice
  213.         tst.l    d0            ; any errors ?
  214.         bne.s    DTError2        ; yep
  215.  
  216.         move.l    a2,MN_REPLYPORT(a3)    ; replies go to this port
  217.         
  218.         movea.l    a3,a1
  219.         move.w    d3,IO_COMMAND(a1)    ; this command
  220.  
  221.         move.l    TV_SECS(a4),IOTV_TIME+TV_SECS(a1)
  222.         move.l    TV_MICRO(a4),IOTV_TIME+TV_MICRO(a1)
  223.  
  224.         CALLSYS    DoIO            ; doit
  225.  
  226.         move.l    IOTV_TIME+TV_SECS(a3),TV_SECS(a4)
  227.         move.l    IOTV_TIME+TV_MICRO(a3),TV_MICRO(a4)
  228.  
  229.         movea.l    a3,a1
  230.         CALLSYS    CloseDevice        ; close the device
  231.  
  232.         moveq.l    #0,d0
  233.         move.b    MP_SIGBIT(a2),d0
  234.         CALLSYS    FreeSignal        ; free port signal
  235.  
  236. DTCleanup:
  237.         lea.l    IOTV_SIZE+MP_SIZE(sp),sp    ; clean up stack
  238.         movem.l    (sp)+,d2-d3/a2-a4/a6
  239.         rts
  240.  
  241. DTError2:
  242.         moveq.l    #0,d0
  243.         move.b    MP_SIGBIT(a2),d0
  244.         CALLSYS    FreeSignal        ; free port signal
  245.  
  246. DTError1:
  247.         moveq.l    #-1,d0
  248.         bra.s    DTCleanup
  249.  
  250.  
  251.     END
  252.  
  253.